home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / iso9660 / mail / mh / contrib / 9210 / stack.shr < prev    next >
Encoding:
Text File  |  1992-10-22  |  29.9 KB  |  1,193 lines

  1. : Run this shell script with "sh" not "csh"
  2. PATH=:/bin:/usr/bin:/usr/ucb
  3. export PATH
  4. all=FALSE
  5. if [ $1x = -ax ]; then
  6.     all=TRUE
  7. fi
  8. /bin/echo 'Extracting stacknews'
  9. sed 's/^X//' <<'//go.sysin dd *' >stacknews
  10. #!/usr/bin/perl
  11. #
  12. # stacknews - create and maintain a folder stack for reading news
  13. #
  14. # This program builds a folder stack (separate from the MH folder stack)
  15. # of news groups to be read.  It prints the path to the appropriate
  16. # MH context file.  A separate MH context is kept for each news group.
  17. # This should speed up certain MH operations and avoids the problem of
  18. # having news group folders in your main MH context.
  19. #
  20. # Usage: 
  21. #    setenv MHCONTEXT \
  22. #        `stacknews [-(no)check] [-(no)clear] [-(no)debug] [-(no)list]
  23. #               [-(no)next] [-(no)push] [-(no)rigor] group ...`
  24. #
  25. # Options:
  26. #    -check        find the first group with new articles
  27. #    -clear        clear the folder stack
  28. #    -debug        turn on debugging
  29. #    -list        list the folder stack
  30. #    -next        pop the folder stack
  31. #    -nocheck    push all groups unconditionally
  32. #    -noclear    do not clear the folder stack
  33. #    -nodebug    operate in normal (non-debug) mode
  34. #    -nolist        do not list the folder stack
  35. #    -nonext        do not pop the folder stack
  36. #    -nopush        do not push groups onto the folder stack
  37. #    -norigor    use defaults or the environment ONLY
  38. #    -push        push groups onto the folder stack
  39. #    -rigor        check the MH profile (the usual MH stuff)
  40. #
  41. # Defaults: -check -noclear -nodebug -nonext -push -rigor
  42. #
  43. #        Any groups on the command line are pushed onto the stack.
  44. #        If no groups are specified, then all default groups are
  45. #        pushed onto the stack.
  46. #
  47. #        Mutually exclusive options: -clear, -list, -next, -push
  48. #
  49. # Some useful code to include in your .cshrc file:
  50. #
  51. #   if (! $?stacknews) then
  52. #     set stacknews = "stacknews"
  53. #   endif
  54. #   alias sninvo 'setenv MHCONTEXT `$stacknews \!*`'
  55. #   alias news 'set stacknews = "stacknews" ; sninvo'
  56. #   alias fnews 'set stacknews = "stacknews.f" ; sninvo'
  57. #   alias g 'setenv MHCONTEXT `$stacknews -next \!*`'
  58. #   alias q 'folder -fast last > /dev/null ; g'
  59. #   alias u 'setenv MHCONTEXT `$stacknews -nopush \!*`'
  60. #   alias z '$stacknews -clear \!*; unsetenv MHCONTEXT'
  61. #   alias nglist '$stacknews -list \!*'
  62. #
  63. # The code above defines the following commands:
  64. #    g    -- Go to the next news group.
  65. #    news    -- Read new news groups.
  66. #    nglist    -- See the current state of the news stack.
  67. #    q    -- Set the last article to be the current article
  68. #        --     and go to the next news group.
  69. #    sninvo    -- Utility alias to invoke stacknews.
  70. #    u    -- Set ("update") another shell's MHCONTEXT ...
  71. #            but unfortunately doesn't handle the case
  72. #            of an alternative set of news groups, e.g.
  73. #            as read by stacknews.f
  74. #    z    -- Stop reading news altogether.
  75. #
  76. #
  77. # Environment variables:
  78. #    HOME        path of home directory
  79. #    MH        path of MH profile file
  80. #    MHCONTEXT    path of current MH context file
  81. #    NEWSARTS     path of top directory containing news articles
  82. #    NEWSCONTEXTS    path of directory containing folder contexts
  83. #    NEWSGROUPS    list of colon-separated news groups to read
  84. #
  85. # MH profile components:
  86. #    context        path of MH context file
  87. #    path        path of MH directory
  88. #    (prog)        default options
  89. #    (prog)-arts    path of top directory containing news articles
  90. #    (prog)-contexts    path of directory containing folder contexts
  91. #    (prog)-defaults    path of file containing list of news groups
  92. #    (prog)-groups    list of comma-separated news groups to read
  93. #
  94. # Note: "(prog)" above is the invocation name of the program;
  95. #    MH profile components might be named stacknews-defaults, 
  96. #    stacknews-groups, and stacknews-arts, if the program is invoked
  97. #    as "stacknews".
  98. #
  99. # Files and Directories:
  100. #    $HOME/.mh_profile        default MH profile
  101. #    $HOME/.news-contexts        default news folder contexts directory
  102. #    $HOME/.news-contexts/Stack    news folder stack
  103. #    $HOME/.news-defaults        list of default news groups
  104. #    $HOME/Mail            default MH directory
  105. #    $HOME/Mail/context        default MH context file
  106. #
  107. # Author: Jerry Sweet <jns@fernwood.mpk.ca.us>
  108. # Taken from my old, similar, but much slower, "news" program.
  109. #
  110. # $Header: /q2/uh/jsweet/src/mh-front/RCS/stacknews,v 1.6 1992/06/11 18:24:52 jsweet Exp $
  111.  
  112. #
  113. # Subprograms
  114. #
  115.  
  116. sub relative_to_absolute {
  117.   local($_) = @_;
  118.  
  119.   if ($_ !~ /^\//) {
  120.     $_ = sprintf("%s%s%s", $mhroot, $_ ? '/' : '', $_);
  121.   }
  122.   if ($_ !~ /^\//) {
  123.     $_ = sprintf("%s/%s", $ENV{'HOME'}, $_);
  124.   }
  125.   $_;
  126. }
  127.  
  128. sub destroy_cur {
  129.   local($dir) = @_;
  130.   local($sequence_file) = "$dir/.mh_sequences";
  131.  
  132.   unlink $sequence_file if ($update_cur && -e $sequence_file);
  133.       # This is the only known way (in MH 6.6 at least) to reset cur if new
  134.       # messages have arrived in a folder (via rcvstore) after all messages
  135.       # were removed or refiled.
  136. }
  137.  
  138. #
  139. # Main
  140. #
  141.  
  142. umask 077;    # This should be adjustable, but isn't at the moment.
  143.  
  144. ($prog = $0) =~ s%.*/%%;
  145.  
  146. $newsarts = defined $ENV{'NEWSARTS'} ? $ENV{'NEWSARTS'} : '/usr/spool/news';
  147. $HOME = $ENV{'HOME'} ;
  148. $profile = defined $ENV{'MH'} ? $ENV{'MH'} : "$HOME/.mh_profile";
  149. $mhroot = "$HOME/Mail";
  150. if (defined $ENV{'NEWSGROUPS'}) {
  151.   @groups = split(/:/, $ENV{'NEWSGROUPS'});
  152. }
  153. $contexts = defined $ENV{'NEWSCONTEXTS'} ? 
  154.             $ENV{'NEWSCONTEXTS'} : 
  155.             "$HOME/.news-contexts";
  156. $mhcontext = defined $ENV{'MHCONTEXT'} ?
  157.             $ENV{'MHCONTEXT'} :
  158.             "$mhroot/context";
  159.  
  160. $check_folders = 1;
  161. $rigor = 1;
  162. $push = 1;
  163.  
  164. # Look for the -norigor option in the command line.
  165.  
  166. while ($_ = shift @ARGV) {
  167.   push(@Args, $_);
  168.   /^-norigor$/ && $rigor--;
  169.   /^-rigor$/   && $rigor++;
  170. }
  171.  
  172. if ($rigor > 0) {
  173.   $ndfile = -e "$HOME/.news-defaults" ? "$HOME/.news-defaults" : '';
  174.  
  175.   $profile_component = 'x-bogus';
  176.   
  177.   if (! open(PROFILE, "<$profile")) {
  178.     print STDERR "$prog: can't open profile \"$profile\" - $!\n";
  179.   }
  180.   else {
  181.     while (<PROFILE>) {
  182.       /^(\S+):\s*/ && do {
  183.           ($profile_component = $1) =~ tr/A-Z/a-z/;
  184.           $PROFILE_COMPONENT{$profile_component} = $';
  185.       };
  186.   
  187.       /^[ \t]/ && do {
  188.           $PROFILE_COMPONENT{$profile_component} .= $_;
  189.       };
  190.     }
  191.   
  192.     if (defined $PROFILE_COMPONENT{'path'}) {
  193.       $_ = $PROFILE_COMPONENT{'path'};
  194.       /^\s*(\S+)/ && do { $mhroot = $1; };
  195.     }
  196.     if (defined $PROFILE_COMPONENT{'context'}) {
  197.       $_ = $PROFILE_COMPONENT{'context'};
  198.       /^\s*(\S+)/ && do { 
  199.           $mhcontext = $1; 
  200.           if ($mhcontext !~ /^\//) {
  201.               $mhcontext = "$mhroot/$mhcontext";
  202.           }
  203.       };
  204.     }
  205.     if (defined $PROFILE_COMPONENT{$prog}) {
  206.       $_ = $PROFILE_COMPONENT{$prog};
  207.       @Args = (split, @Args);
  208.     }
  209.     if (defined $PROFILE_COMPONENT{"$prog-arts"}) {
  210.       $_ = $PROFILE_COMPONENT{"$prog-arts"};
  211.       /^\s*(\S+)/ && do { $newsarts = $1; };
  212.     }
  213.     if (defined $PROFILE_COMPONENT{"$prog-contexts"}) {
  214.       $_ = $PROFILE_COMPONENT{"$prog-contexts"};
  215.       /^\s*(\S+)/ && do { 
  216.           $contexts = $1; 
  217.           if ($contexts !~ /^\//) {
  218.               $contexts = "$mhroot/$contexts";
  219.           }
  220.       };
  221.     }
  222.     if (defined $PROFILE_COMPONENT{"$prog-defaults"}) {
  223.       $_ = $PROFILE_COMPONENT{"$prog-defaults"};
  224.       /^\s*(\S+)/ && do { 
  225.           $ndfile = $1; 
  226.           if ($contexts !~ /^\//) {
  227.               $contexts = "$mhroot/$contexts";
  228.           }
  229.       };
  230.     }
  231.     if (defined $PROFILE_COMPONENT{"$prog-groups"}) {
  232.       $_ = $PROFILE_COMPONENT{"$prog-groups"};
  233.       @profile_groups = split(/\s*,\s*/);
  234.     }
  235.   }
  236. }
  237.  
  238. # Evaluate the switches:
  239.  
  240. while ($_ = shift @Args) {
  241.   /^-check$/      && $check_folders++;
  242.   /^-clear$/      && $clear_stack++;
  243.   /^-debug$/      && $debug++;
  244.   /^-list$/      && $list++;
  245.   /^-next$/      && $next++;
  246.   /^-nocheck$/      && $check_folders--;
  247.   /^-noclear$/      && $clear_stack--;
  248.   /^-nodebug$/      && $debug--;
  249.   /^-nolist$/      && $list--;
  250.   /^-nonext$/      && $next--;
  251.   /^-nopush$/     && $push--;
  252.   /^-push$/       && $push++;
  253.   /^[^-]/      && push(@switch_groups, $_);
  254. }
  255.  
  256. if (! -d $contexts) {
  257.   if (! mkdir($contexts, 0700)) {
  258.     print STDERR "$prog: can't mkdir \"$contexts\" - $!\n";
  259.     exit 1;
  260.   }
  261. }
  262.  
  263.   
  264. $folder_stack = "$contexts/Stack";
  265.  
  266. if ($clear_stack > 0) {
  267.   @groups = ();
  268. }
  269. else {
  270.   # Read the folder stack:
  271.   
  272.   if (-e $folder_stack) {
  273.     if (! open(STACK, "<$folder_stack")) {
  274.       print STDERR 
  275.       "$prog: can't open folder stack file \"$folder_stack\" - $!\n";
  276.       print "$mhcontext\n" unless ! $print_context;
  277.       exit 1;
  278.     }
  279.     foreach (<STACK>) {
  280.       next if /^#|^\s*$/;
  281.       push(@stack, split);
  282.     }
  283.   }
  284.  
  285.   if ($list > 0) {
  286.     foreach (@stack) {
  287.       push(@group_list, $_);
  288.     }
  289.  
  290.     if ($#group_list >= 0) {
  291.       print STDERR join(' ', @group_list), "\n";
  292.     }
  293.     exit 0;
  294.   }
  295. }
  296.  
  297. shift(@stack) if ($next > 0);  # If we saw -next, then pop the stack.
  298.  
  299. if ($clear_stack <= 0 && $next <= 0 && $push > 0) {
  300.   # Decide on the news groups at which to look:
  301.  
  302.   if ($#switch_groups < 0 && $#profile_groups >= 0) {
  303.     push(@groups, @profile_groups);
  304.         # Select groups from the (prog)-groups: component.
  305.   }
  306.  
  307.   if ($#groups < 0 && $#switch_groups < 0 && $ndfile) {
  308.     # Look at the .news-defaults file:
  309.   
  310.     if (! open(NDFILE, $ndfile)) {
  311.       print STDERR "$prog: can't open news defaults file \"$ndfile\" - $!\n";
  312.       print "$mhcontext\n" unless ! $print_context;
  313.       exit 1;
  314.     }
  315.   
  316.     while (<NDFILE>) {
  317.       next if /^#|^\s*$/;
  318.       split;
  319.       push(@groups, @_);
  320.     }
  321.   }
  322.  
  323.   # Push news groups onto the folder stack:
  324.   
  325.   push(@stack, @groups);
  326.  
  327.   # Push groups from the command line onto the front of the stack:
  328.  
  329.   foreach (reverse(@switch_groups)) {
  330.     unshift(@stack, $_);
  331.   }
  332. }
  333.  
  334. if ($clear_stack <= 0 && $push > 0) {
  335.   # Find the first group for which new articles have arrived:
  336.  
  337.   if ($check_folders > 0) {
  338.     select(STDERR);
  339.     $| = 1;    # Force output of '.' as we look for a good group
  340.     select(STDOUT);
  341.   }
  342.  
  343.   $newsarts_cur = $newsarts;
  344.  
  345.   while ($#stack >= 0) {
  346.     ($_ = $stack[0]) =~ s/\s+//g;
  347.  
  348.     # An item beginning with '+' specifies a folder instead of
  349.     # a news group.
  350.  
  351.     if (/^\+/) {
  352.       $_ = $';
  353.       $group = $_;
  354.       $dir = &relative_to_absolute($_);
  355.       $folder = $_;
  356.       s%/%.%g;
  357.       $cur_context = "$contexts/FOLDER.$_";
  358.           # Bug: +foo.bar will have the same context as +foo/bar.
  359.       $update_cur = 1;
  360.     }
  361.     else  {
  362.       $group = $_;
  363.       s%\.%/%g;
  364.       $dir = "$newsarts_cur/$_";
  365.       $folder = $dir;
  366.       $cur_context = "$contexts/$group";
  367.       $update_cur = 0;
  368.     }
  369.  
  370.     # print STDERR "group  = \"$group\"\n", 
  371.     #          "dir    = \"$dir\"\n",
  372.     #          "folder = \"$folder\"\n",
  373.     #          "ctxt   = \"$cur_context\"\n",
  374.     #          "stack  = ", join(' ', @stack), "\n"
  375.     #     ;
  376.  
  377.     last if ($check_folders <= 0);
  378.  
  379.     if (! -d $dir) {
  380.       print STDERR "\nno such news group as $group\n";
  381.       shift @stack;
  382.       next;
  383.     }
  384.   
  385.     $ENV{'MHCONTEXT'} = $cur_context;
  386.     $finfo = `folder +$folder`;
  387.     if ($? >> 8) {
  388.       print STDERR "\nfolder change to +$folder failed\n";
  389.       shift @stack;
  390.       next;
  391.     }
  392.     print(STDERR $finfo) if ($debug > 0);
  393.   
  394.     if ($finfo =~ /\s+has\s+no\s+/) {
  395.       # There are no messages in this folder, so ensure that the cur
  396.       # sequence is destroyed and go on to the next folder.
  397.  
  398.       &destroy_cur($dir);
  399.       print STDERR '.';
  400.       $dots++;
  401.       shift @stack;
  402.       next;
  403.     }
  404.   
  405.     if ($finfo =~ /cur=\s*(\d+)/) {
  406.       $cur = $1;
  407.     }
  408.     else {
  409.       # There are messages in here, but there's no cur message apparent,
  410.       # so reset the cur sequence.
  411.  
  412.       &destroy_cur($dir);
  413.       $cur = 0;
  414.     }
  415.   
  416.     if ($finfo =~ /message.*\(\s*(\d+)-\s*(\d+)\s*\)/) {
  417.       $lastm = $2;
  418.   
  419.       if ($cur >= $lastm) {
  420.         # We don't have any new messages in this folder, so go on to
  421.         # the next one.  (Bug: we should check for an "unseen" sequence.)
  422.  
  423.         print STDERR '.';
  424.         $dots++;
  425.         shift @stack;
  426.         next;
  427.       }
  428.       else {
  429.         last;  # Found a live one.
  430.       }
  431.     }
  432.   }  # end while
  433.   
  434.   if ($dots > 0) {
  435.     print STDERR "\n";
  436.     select(STDERR);
  437.     $| = 0;
  438.     select(STDOUT);
  439.   }
  440. }  
  441.  
  442. # Rewrite the folder stack file:
  443.  
  444. if ($clear_stack > 0) {
  445.   @stack = ();
  446. }
  447.  
  448. if ($push > 0) {
  449.   if (! open(STACK, ">$folder_stack")) {
  450.     print STDERR 
  451.       "$prog: can't rewrite folder stack file \"$folder_stack\" - $!\n";
  452.     print "$mhcontext\n" unless ! $print_context;
  453.     exit 1;
  454.   }
  455.   if ( (! print STACK join(' ', @stack)) || ! close(STACK) ) {
  456.     print STDERR 
  457.       "$prog: can't write folder stack file \"$folder_stack\" - $!\n";
  458.     print "$mhcontext\n" unless ! $print_context;
  459.     exit 1;
  460.   }
  461. }
  462.  
  463. if ($clear_stack > 0) {
  464.   exit 0;
  465. }
  466.  
  467. # Tell the user what the state of the folder stack is:
  468.  
  469. if ($#stack >= 0) {
  470.   $_ = $stack[0];
  471.  
  472.   if ($next <= 0) {
  473.     printf(STDERR "%d news group%s selected; topmost: %s\n", 
  474.           $#stack + 1,
  475.           $#stack > 0 ? 's' : '',
  476.           $_);
  477.   }
  478.   else {
  479.     print STDERR "topmost: $_\n";
  480.   }
  481.  
  482.   if (/^\+/) {
  483.     $_ = $';
  484.     s%/%.%g;
  485.     print "$contexts/FOLDER.$_\n";
  486.   }
  487.   else {
  488.     print "$contexts/$_\n";
  489.   }
  490. }
  491. else {
  492.   if ($next <= 0) {
  493.     print STDERR "no news groups selected\n";
  494.   }
  495.   print "$mhcontext\n" unless ! $print_context;
  496. }
  497.  
  498. exit 0;
  499. //go.sysin dd *
  500. made=TRUE
  501. if [ $made = TRUE ]; then
  502.     /bin/chmod 555 stacknews
  503.     /bin/echo -n '    '; /bin/ls -ld stacknews
  504. fi
  505. /bin/echo 'Extracting stacknews.aliases'
  506. sed 's/^X//' <<'//go.sysin dd *' >stacknews.aliases
  507. # stacknews.aliases - Stacknews-related csh aliases
  508. #
  509. # Usage: source <path>/stacknews.aliases
  510. #
  511. # Author: Jerry Sweet <jsweet@ics.uci.edu>
  512. #
  513. # $Id: stacknews.aliases,v 1.1 1992/08/20 19:27:23 jsweet Exp $
  514.  
  515. if (! $?stacknews) then
  516.   set stacknews = "stacknews"
  517. endif
  518. alias sninvo 'setenv MHCONTEXT `$stacknews \!*`'
  519. alias news 'set stacknews = "stacknews" ; sninvo'
  520. alias fnews 'set stacknews = "stacknews.f" ; sninvo'
  521. alias g 'setenv MHCONTEXT `$stacknews -next \!*`'
  522. alias q 'folder -fast last >& /dev/null ; g'
  523. alias u 'setenv MHCONTEXT `$stacknews -nopush \!*`'
  524. alias z '$stacknews -clear \!*; unsetenv MHCONTEXT'
  525. alias nglist '$stacknews -list \!*'
  526. //go.sysin dd *
  527. made=TRUE
  528. if [ $made = TRUE ]; then
  529.     /bin/chmod 400 stacknews.aliases
  530.     /bin/echo -n '    '; /bin/ls -ld stacknews.aliases
  531. fi
  532. /bin/echo 'Extracting stacknews.l'
  533. sed 's/^X//' <<'//go.sysin dd *' >stacknews.l
  534. X.\"    $Header: /q2/uh/jsweet/src/mh-front/RCS/stacknews.l,v 1.3 1992/06/11 18:41:48 jsweet Exp $
  535. X.\"
  536. X.TH STACKNEWS 1 STACKNEWS
  537. X.UC 6
  538. X.SH NAME
  539. stacknews \- USENET news + MH utility
  540.  
  541. X.SH SYNOPSIS
  542. setenv MHCONTEXT `stacknews 
  543. \%[\-(no)check]
  544. \%[\-(no)clear]
  545. \%[\-(no)debug]
  546. \%[\-(no)list]
  547. \%[\-(no)next]
  548. \%[\-(no)push]
  549. \%[\-(no)rigor]
  550. \%[newsgroup ...]
  551. \%[+folder ...]`
  552.  
  553. X.SH DESCRIPTION
  554.  
  555. Stacknews is a utility program for reading USENET news via MH.
  556. Stacknews works in conjunction with the c-shell and MH to permit you
  557. to read news at the shell level, without resorting to news readers such
  558. as nn or rn.
  559.  
  560. Stacknews is not itself the command that you invoke to read news;
  561. other commands do that on your behalf, such as "news", "g", "z", and
  562. "nglist".
  563. These commands are c-shell aliases that invoke stacknews with
  564. the appropriate options to perform different operations.
  565.  
  566. To use stacknews, you must add some alias definitions to your .cshrc
  567. file.  The required code is described in the INSTALLATION section of
  568. this man page.
  569.  
  570. More complete descriptions of the various stacknews-related news
  571. reading commands are:
  572. X.in +1i
  573.  
  574. X.ti -.5i
  575. news
  576. X.br
  577. Creates the initial conditions necessary to begin reading news at the
  578. shell level: the list of news group folders is built, and the first 
  579. folder is selected.
  580.  
  581. X.ti -.5i
  582. g
  583. X.br
  584. Goes to the next news group in the list.
  585.  
  586. X.ti -.5i
  587. q
  588. X.br
  589. Quits a news group and goes to the next one.
  590. This is similar to the "g" command, but before going to the next news group,
  591. the "q" command sets the last message to be current.
  592.  
  593. X.ti -.5i
  594. u
  595. X.br
  596. Updates the current shell so that news reading can pick up where it
  597. left off.
  598. This is useful if you logged out before reading all your news,
  599. or if you switched windows.
  600.  
  601. X.ti -.5i
  602. z
  603. X.br
  604. Clears the list of news groups and permits you to stop reading news
  605. altogether.
  606.  
  607. X.ti -.5i
  608. nglist
  609. X.br
  610. Lists the news groups waiting to be read.
  611.  
  612. X.in -1i
  613.  
  614. Stacknews allows folders to be used interchangeably with news groups.
  615. This facility is of particular use with automatically updated folders,
  616. e.g. those folders to which incoming e-mail is automatically redirected
  617. via the rcvstore(1) program.
  618.  
  619.  
  620. X.SH INSTALLATION
  621.  
  622. Stacknews requires certain semi-specialized conditions to pertain:
  623. X.PP
  624. X.in +.5i
  625. 1) Stacknews can be used only on the primary news machine, unless the news
  626. spool directory (typically /usr/spool/news) is NFS-mounted.
  627. Stacknews does not require that the news spool directory be present
  628. if you read NO news groups, and specify only your own folders.
  629. X.PP
  630. X.in +.5i
  631. 2) Stacknews is written in perl, and therefore perl 4.0 or later must be
  632. installed on your system.
  633. X.PP
  634. X.in +.5i
  635. 3) Stacknews uses certain specialized features of MH, and therefore 
  636. MH 6.6 or later must be installed on your system.
  637. X.in -.5i
  638. X.PP
  639.  
  640. If you aren't sure whether these conditions pertain,
  641. take these steps to find out:
  642. X.PP
  643. 1. Type this command:
  644. X.in +.5i
  645. ls /usr/spool/news
  646. X.in -.5i
  647. X.PP
  648. If you don't see anything in that directory, or if it doesn't exist,
  649. then you can't use stacknews to read USENET news.
  650. If the news spool directory is something other than /usr/spool/news,
  651. then you may specify the alternative news spool directory in
  652. the stacknews-arts component in your .mh_profile (see the MH PROFILE
  653. COMPONENTS section in this document).
  654. If you don't have a news spool directory on your machine,
  655. you can still use stacknews to read folders.
  656. X.PP
  657. 2. Type this command:
  658. X.in +.5i
  659. perl -v
  660. X.in -.5i
  661. X.PP
  662. If the version number displayed isn't 4.0 or later, then you might
  663. have problems running stacknews.
  664. You can give it a try, but it isn't guaranteed to work.
  665. X.PP
  666. 3. Type this command:
  667. X.in +.5i
  668. folder -help
  669. X.in -.5i
  670. X.PP
  671. If the version number of MH displayed at the bottom of the output of
  672. the "folder" command isn't 6.6 or greater, 
  673. then the version of MH on your system may lack the features necessary
  674. to support stacknews.
  675. You can give it a try, but it isn't guaranteed to work.
  676.  
  677. The stacknews program itself may be installed anywhere.  
  678. The directory /usr/local/bin is not a bad choice.
  679. If you don't have access to that directory, then choose some
  680. directory that occurs in your PATH, e.g. ~/bin.
  681.  
  682. Add these lines to the .cshrc file in your home directory:
  683. X.in +.5i
  684. # Define some stacknews-related aliases
  685. X.br
  686.  
  687. X.br
  688. if\ (!\ $?stacknews)\ then
  689. X.br
  690. \ \ set\ stacknews\ =\ "stacknews"
  691. X.br
  692. endif
  693. X.br
  694. alias\ sninvo\ 'setenv\ MHCONTEXT\ `$stacknews\ \!*`'
  695. X.br
  696. alias\ news\ 'set\ stacknews\ =\ "stacknews"\ ;\ sninvo'
  697. X.br
  698. alias\ g\ 'setenv\ MHCONTEXT\ `$stacknews\ \-next\ \!*`'
  699. X.br
  700. alias\ q\ 'folder\ \-fast\ last\ >\ /dev/null\ ;\ g'
  701. X.br
  702. alias\ u\ 'setenv\ MHCONTEXT\ `$stacknews\ \-nopush\ \!*`'
  703. X.br
  704. alias\ z\ '$stacknews\ \-clear\ \!*;\ unsetenv\ MHCONTEXT'
  705. X.br
  706. alias\ nglist\ '$stacknews\ \-list\ \!*'
  707. X.in -.5i
  708.  
  709. If you don't already have a .cshrc file in your home directory, then
  710. you must create a .cshrc file to contain the alias definitions above.
  711.  
  712. If any of the stacknews aliases described above conflict with
  713. existing aliases, 
  714. then you'll have to select new names either for the stacknews aliases or for
  715. the previously existing aliases.
  716.  
  717. After you've modified your .cshrc file, at the c-shell prompt
  718. type these commands:
  719. X.PP
  720. X.in +.5i
  721. source\ ~/.cshrc
  722. X.br
  723. rehash
  724. X.in -.5i
  725. X.PP
  726.  
  727. Place into the .news\-defaults file in your home directory the following
  728. lines:
  729. X.PP
  730. X.in +.5i
  731. news.announce.newusers
  732. X.br
  733. news.announce.important
  734. X.br
  735. news.answers
  736. X.br
  737. comp.lang.perl
  738. X.br
  739. comp.mail.mh
  740. X.in -.5i
  741. X.PP
  742. Feel free to add or to delete news groups as needed.  
  743.  
  744. If you have arranged for some of your folders to be updated automatically
  745. via rcvstore(1), you may place folder specifications as well as news groups
  746. into the .news\-defaults file, e.g.:
  747. X.in +.5i
  748. +lists/mh-mime
  749. X.br
  750. +lists/com-priv
  751. X.in -.5i
  752. X.PP
  753.  
  754. To find out what news groups are available, type this command:
  755. X.in +.5i
  756. more ~news/newsgroups
  757. X.in -.5i
  758. X.PP
  759. Other commands may be necessary to find out what news groups are
  760. available on your system.
  761.  
  762.  
  763. X.SH TUTORIAL
  764.  
  765. When you have performed the necessary setups described in the previous 
  766. section, type this command:
  767. X.in +.5i
  768. news
  769. X.in -.5i
  770. X.PP
  771.  
  772. You should see something like this:
  773. X.in +.5i
  774. 5 news groups selected; topmost: news.announce.newusers
  775. X.br
  776. X.in -.5i
  777. X.PP
  778.  
  779. Your current folder becomes the news group "news.announce.newusers",
  780. which is the first news group listed in your ~/.news\-defaults file.
  781.  
  782. To read the next new message, type
  783. X.in +.5i
  784. next
  785. X.in -.5i
  786. X.PP
  787. To scan the available messages, type 
  788. X.in +.5i
  789. scan next-last
  790. X.in -.5i
  791. X.PP
  792.  
  793. To move on to the next news group, type 
  794. X.in +.5i
  795. g
  796. X.in -.5i
  797. X.PP
  798. If you see dots (".") printed, that means that stacknews is discarding
  799. news groups in which no new articles have appeared.
  800.  
  801. To select a completely different news group to read next, e.g. "alt.sex",
  802. type
  803. X.in +.5i
  804. news alt.sex
  805. X.in -.5i
  806. X.PP
  807. (The aforementioned news group is not available everywhere, so substitute
  808. some available news group.)
  809.  
  810. To return to a news group in which you might have read the last
  811. message already, e.g. "news.announce.newusers", type
  812. X.in +.5i
  813. news -nocheck news.newusers
  814. X.in -.5i
  815. X.PP
  816.  
  817. To see the list of news groups to be read, type 
  818. X.in +.5i
  819. nglist
  820. X.in -.5i
  821. X.PP
  822.  
  823. If you change windows, or log out and log back in again later, and
  824. you wish to resume reading news, then type 
  825. X.in +.5i
  826. u
  827. X.in -.5i
  828. X.PP
  829.  
  830. To stop reading news, type 
  831. X.in +.5i
  832. z
  833. X.in -.5i
  834. X.PP
  835.  
  836.  
  837. X.SH OPTIONS
  838.  
  839. Stacknews is designed to be invoked via c-shell aliases.  Therefore,
  840. you should not find it desirable or necessary to invoke stacknews
  841. directly.  Furthermore, the various options to stacknews are not
  842. guaranteed to interoperate, except as they are used in the c-shell
  843. aliases listed in the INSTALLATION section.
  844.  
  845. The default settings are:
  846. X.in +.5i
  847. \-check \-noclear \-nodebug \-nonext \-push \-rigor
  848. X.in +.5i
  849. X.PP
  850.  
  851. Any news groups specified on the command line are pushed onto the 
  852. news group stack.
  853. If no groups are specified, then all default groups are
  854. pushed onto the stack (typically from ~/.news-defaults).
  855.  
  856. Mutually exclusive options: \-clear, \-list, \-next, \-push.
  857.  
  858.  
  859. The options are:
  860.  
  861. X.in +1i
  862.  
  863. X.ti -.5i
  864. -check
  865. X.ti -.5i
  866. -nocheck
  867. X.br
  868. By default, when stacknews selects a new news group, 
  869. it is simply discarded if it has no new articles.
  870. A group is considered to have new articles if there are articles following
  871. the "cur" message sequence.
  872. The -nocheck option prevents the check for new articles; a group is
  873. pushed unconditionally.
  874. The -check option corresponds to the default behavior; it negates
  875. a -nocheck option if -nocheck is present.
  876.  
  877. X.ti -.5i
  878. -clear
  879. X.ti -.5i
  880. -noclear
  881. X.br
  882. The -clear option causes stacknews to clear the news group stack.
  883. The -noclear option simply negates the -clear option when the -clear
  884. option is present.
  885.  
  886. X.ti -.5i
  887. -debug
  888. X.ti -.5i
  889. -nodebug
  890. X.br
  891. The -debug option causes a limited amount of information to be printed
  892. on STDERR that is not normally displayed.
  893.  
  894. X.ti -.5i
  895. -list
  896. X.ti -.5i
  897. -nolist
  898. X.br
  899. The -list option causes the state of the news group stack to be printed.
  900. The -nolist option negates the -list option when the -list option is
  901. present.
  902.  
  903. X.ti -.5i
  904. -next
  905. X.ti -.5i
  906. -nonext
  907. X.br
  908. The -next option pops the news group stack and causes the next news
  909. group that contains new articles to be selected.
  910. If the -nocheck option is present, the check for new articles is suppressed,
  911. and the next news group in the news group stack is selected unconditionally.
  912. The -nonext option negates the -next option when the -next option is
  913. present.
  914.  
  915. X.ti -.5i
  916. -push
  917. X.ti -.5i
  918. -nopush
  919. X.br
  920. The -push option pushes a new news group onto the top of the news group
  921. stack.
  922. The -nopush option in a sense performs no operation,
  923. except that it causes the topmost news group to be selected.
  924.  
  925. X.ti -.5i
  926. -rigor
  927. X.ti -.5i
  928. -norigor
  929. X.br
  930. By default, stacknews functions as a normal MH program does, i.e. it
  931. checks the environment for relevant information and then checks
  932. the user's MH profile file (typically .mh_profile in the home directory).
  933. The -norigor option causes the MH profile to be ignored; only the
  934. environment is considered.
  935.  
  936.  
  937. X.in -1i
  938.  
  939. X.SH DESIGN RATIONALE
  940.  
  941. Most USENET news implementations organize news groups as directories.
  942. To translate a USENET news group into a directory path, substitute
  943. slashes ("/") for dots ("."), and prepend the path of the news spool
  944. directory, typically /usr/spool/news.
  945.  
  946. MH already uses directories relative to a pre-determined path for folders, 
  947. e.g. the notation "+inbox" refers to the directory "$HOME/Mail/inbox".
  948. Fortunately, MH can also use an absolute path in a folder specification.
  949. A USENET news group is treated by stacknews as a folder with an
  950. absolute path, e.g. "+/usr/spool/news/comp/lang/perl".
  951.  
  952. For most users, a USENET news group will be treated as a read-only folder.
  953. Because of the way MH interacts with read-only folders,
  954. certain MH features, such as message annotation (anno), digest
  955. bursting (burst), and refiling (refile) should not be expected to
  956. work properly when read-only folders are selected,
  957. although some work-arounds are possible.
  958. The majority of MH features are available, 
  959. such as pick(1), forw(1), show(1), etc.
  960.  
  961. Because MH slows down considerably when a large number of private
  962. sequences accumulates in the default context file, 
  963. a separate context is kept for each news group.
  964. The prevailing context is specified by setting the environment
  965. variable MHCONTEXT, which is recognized by all MH programs.
  966.  
  967. C-shell aliases are employed to implement the various stacknews-related 
  968. commands.
  969. Using c-shell aliases permits the output of stacknews to be used to set
  970. the MHCONTEXT variable.
  971.  
  972. UNIX presently does not permit environment information to be shared among
  973. different "peer" processes.
  974. To overcome this problem, the "u" command is provided to
  975. "update" the MHCONTEXT variable among different interactive shells,
  976. e.g. login sessions and windows.
  977.  
  978. By invoking the "news" command, you build a stack of news groups or
  979. folders that you want to read in sequence.
  980. A default list of news groups to be read is taken from a file that you 
  981. create, ~/.news-defaults.
  982. Progression from news group to news group is accomplished by invoking
  983. "g", which is a command to "pop" succeeding folders off the top of the list.
  984.  
  985. Because the default MH folder stack, as used by "folder\ \-push",
  986. is kept in the context file,
  987. and because the context changes according to the setting of the
  988. MHCONTEXT variable,
  989. stacknews maintains an entirely separate folder stack.
  990.  
  991.  
  992. X.SH ENVIRONMENT
  993.  
  994. Stacknews uses many different environment variables, some in common
  995. with MH.
  996. They are:
  997. X.in +1i
  998. X.ti -.5i
  999. HOME
  1000. X.br
  1001. Path of home directory.  
  1002.  
  1003. X.ti -.5i
  1004. MH
  1005. X.br
  1006. Path of MH profile file.  Used by all MH programs.
  1007. Default: ~/.mh_profile.
  1008.  
  1009. X.ti -.5i
  1010. MHCONTEXT
  1011. X.br
  1012. Path of current MH context file.  Used by all MH programs.
  1013. Default: ~/Mail/context.
  1014.  
  1015. X.ti -.5i
  1016. NEWSARTS
  1017. X.br
  1018. Path of top directory containing news articles.
  1019. Default: /usr/spool/news.
  1020.  
  1021. X.ti -.5i
  1022. NEWSCONTEXTS
  1023. X.br
  1024. Path of directory containing folder contexts
  1025. Default: ~/.news-contexts.
  1026.  
  1027. X.ti -.5i
  1028. NEWSGROUPS
  1029. X.br
  1030. List of colon-separated news groups to read.
  1031. Defaults: as specified in ~/.news-defaults.
  1032.  
  1033. X.in -1i
  1034.  
  1035. X.SH MH PROFILE COMPONENTS
  1036.  
  1037. Stacknews reads the MH profile unless the -norigor option is specified.
  1038.  
  1039. The MH environment variable is consulted to determine which MH profile
  1040. file to read.
  1041. If the MH environment variable is not defined, then the ~/.mh_profile
  1042. file is read.
  1043.  
  1044. The MH profile components relevant to stacknews are:
  1045.  
  1046. X.in +1i
  1047.  
  1048. X.ti -.5i
  1049. context:
  1050. X.br
  1051. Path of MH context file.
  1052. Default: as specified in the MHCONTEXT environment variable, or 
  1053. ~/Mail/context.
  1054.  
  1055. X.ti -.5i
  1056. Path:
  1057. X.br
  1058. Path of MH directory.
  1059. Default: ~/Mail.
  1060.  
  1061. X.ti -.5i
  1062. stacknews:
  1063. X.br
  1064. Stacknews options.
  1065. Defaults: \-check \-noclear \-nodebug \-nonext \-push \-rigor.
  1066.  
  1067. X.ti -.5i
  1068. stacknews-arts:
  1069. X.br
  1070. Path of top directory containing news articles.
  1071. Default: As specified by the NEWSARTS environment variable or
  1072. X/usr/spool/news.
  1073.  
  1074. X.ti -.5i
  1075. stacknews-contexts:
  1076. X.br
  1077. Path of directory containing folder contexts.
  1078. Default: As specified by the NEWSCONTEXTS environment variable or
  1079. ~/.news-contexts.
  1080.  
  1081. X.ti -.5i
  1082. stacknews-defaults:
  1083. X.br
  1084. Path of file containing list of news groups.
  1085. Default: ~/.news-defaults.
  1086.  
  1087. X.ti -.5i
  1088. stacknews-groups:
  1089. X.br
  1090. List of comma-separated news groups to read.
  1091. Defaults: as specified in the NEWSGROUPS environment variable,
  1092. or as specified in ~/.news-defaults.
  1093.  
  1094. X.in -1i
  1095.  
  1096. Where "stacknews" is specified in a .mh_profile component,
  1097. stacknews looks for its invocation name.
  1098. The relevant MH profile components are therefore normally
  1099. named stacknews-defaults, stacknews-groups, and stacknews-arts.
  1100. However, if stacknews were invoked as "stn", then stacknews would
  1101. instead look for components named stn-defaults, stn-groups,
  1102. and stn-arts.
  1103. The variable prefix for components permits different invocations
  1104. of stacknews to use different sets of options.
  1105.  
  1106.  
  1107. X.SH FILES
  1108.  
  1109. X.in +1i
  1110.  
  1111. X.ti -.5i
  1112. $HOME/.mh_profile
  1113. X.br
  1114. Default MH profile.
  1115.  
  1116. X.ti -.5i
  1117. $HOME/.news-contexts
  1118. X.br
  1119. Default news folder contexts directory.
  1120. All of the context files to which MHCONTEXT refers are kept here.
  1121.  
  1122. X.ti -.5i
  1123. $HOME/.news-contexts/Stack
  1124. X.br
  1125. News folder stack.
  1126.  
  1127. X.ti -.5i
  1128. $HOME/.news-contexts/FOLDER.*
  1129. X.br
  1130. Context files for folders.
  1131. For example, "FOLDER.lists.mh-mime" is the context file for the 
  1132. folder "+lists/mh-mime".
  1133. (This representation has a problem in that dots in folder names
  1134. may result in context file name collisions, e.g. in the case
  1135. of "+lists.mh-mime".)
  1136.  
  1137. X.ti -.5i
  1138. $HOME/.news-contexts/[a-z]*
  1139. X.br
  1140. Context files for news groups.
  1141.  
  1142. X.ti -.5i
  1143. $HOME/.news-defaults
  1144. X.br
  1145. List of default news groups.
  1146.  
  1147. X.ti -.5i
  1148. $HOME/Mail
  1149. X.br
  1150. Default MH directory.
  1151.  
  1152. X.ti -.5i
  1153. $HOME/Mail/context
  1154. X.br
  1155. Default MH context file.
  1156.  
  1157. X.in -1i
  1158.  
  1159. X.SH AUTHOR
  1160.  
  1161. Jerry Sweet <jsweet@ics.uci.edu>
  1162.  
  1163. X.SH MISCELLANEOUS INFORMATION
  1164.  
  1165. This man page describes version 1.5 of stacknews.
  1166.  
  1167. X.SH BUGS
  1168.  
  1169. It's easy to lose your way if you use "folder\ \-push".
  1170.  
  1171. Stacknews doesn't address some of the problems posed by using MH to
  1172. handle news groups, as well some general problems posed by
  1173. read-only folders.  
  1174. For example, the problem of posting news versus
  1175. sending e-mail needs to be addressed at some level between the UA and
  1176. the MTA.  
  1177. Another problem is that of copying versus linking messages.
  1178. Some partial work-arounds have been devised by the author, but these
  1179. are not yet in releasable form.
  1180. Some tweaks to MH itself (e.g. in the "post" program) might be
  1181. desirable the better to accommodate news and read-only folders.
  1182.  
  1183. X.SH SEE ALSO
  1184. X.IR csh (1),
  1185. X.IR mh(1)
  1186. //go.sysin dd *
  1187. made=TRUE
  1188. if [ $made = TRUE ]; then
  1189.     /bin/chmod 444 stacknews.l
  1190.     /bin/echo -n '    '; /bin/ls -ld stacknews.l
  1191. fi
  1192.